\documentclass[a4paper, 12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage[margin=2.5cm]{geometry}
\usepackage{graphicx}

\author{Inmaculada Alcón Piñero}
\begin{document}
\tableofcontents{}
\chapter{Introducción}
	\section{\bf Objetivos}		
		El objetivo principal de este proyecto es desarrollar una aplicación para un dispositivo móvil con Sistema Operativo Android que sirva como guía y geolocalizador para Estadios Deportivos, Escuelas de la Universidad de Sevilla y Monumentos históricos. A grandes rasgos:
			\begin{enumerate} 
				\item Representar en el mapa las rutas más adecuadas de llegada de un lugar a otro en Sevici y en bus. 		Dibujando un recorrido y ubicando las paradas pertinentes de ambos medios de transporte.
				\item Mostrar información de todos los lugares que tenemos.
				\item Mostrar la información en dos niveles, para leer en pantalla y para escuchar mediante los auriculares del dispositivo móvil.
				\item Establecer una ruta entre la posición del usuario y un monumento.	
				\item Proporcionar información sobre los lugares que hemos ubicado, sobre su historia, una información más detallada y por último una información sobre medios de transportes que se puedan usar para llegar allí.\\		
		\end{enumerate}
		
	\section{\bf Justificación}
		No existe ninguna aplicación Android que te explique detalladamente sobre ciertos lugares de nuestra ciudad y menos aún que lo hagan con la posibilidad de hacerlo por audio. Además los recorridos que debemos seguir mediante Sevici y mediante bus son realmente necesarios ya que nos ahorra tiempo. Es una aplicación muy intuitiva y nos mantiene informados a tiempo real. 	\begin{enumerate}
			\item[]{\bf ¿Por qué Android?}
		Android permite de una manera sencilla y rápida el uso y manejo de mapas interactivos de GoogleMaps, lo cuál es idóneo para representar información de recorridos, posiciones y tipos de rutas.
			\item[]{\bf ¿Por qué Guia turística y de Sevilla?}
		Existen múltiples guias turísticas de nuestra ciudad, sea en papel o en medios móviles. Pero la diferencia de ésta con las otras es que el usuario puede escuchar la información a la vez que la lee lo que la hace mucho más accesible, tanto para personas con ceguera como con personas con deficiencia auditiva. 
		Sevilla es una ciudad muy visitada. Cientos de miles de turístas ven Sevilla como un lugar agradable para visitar ya que en ella está contenida mucha historia y muchos lugares exóticos dignos de ser visitados.
		\end{enumerate}
		\newpage
	\section{\bf Análisis de lo existente}
		Android dispone de un "Market", un mercado de aplicaciones. En este mercado de aplicaciones podemos encontrar numerosas aplicaciones sobre turismo, dado que el mundo del turismo es un mercado muy amplio y muy rentable. 
		La diferencia de esta aplicación respecto al resto es que además de ser exclusivamente de Sevilla, nos encontramos con una aplicación que esta categorizada por edificios de la US, estadios deportivos y monumentos tales como iglesias o grandes construcciones arquitectónicas de nuestra ciudad. Además de eso la información sobre los medios de transportes públicos con los que contamos en Sevilla, como Sevici o el servicio de autobuses Tussam. Esta información es muy gratificante para cuando nos queramos trasladar de uno a otro lugar que tenga cosas comunes, nos dice las paradas y también el recorrido que hay que tomar en el caso de las bicicletas mediante dibujos en el mapa. Y sobre todo la novedad que añade es que la información de cada edificio es mostrada por pantalla y mediante voz a través de los auriculares.
		Normalmente las guías que se encuentran, nos dan la información del lugar y nada más. Algunas de estas aplicaciones son las siguientes: 
		\begin{enumerate}
			\item{\bf Layar}
				Ésta es la que más impresiona desde luego. Porque funciona con realidad aumentada, osea funciona con la cámara del móvil. Entonces te ubica mediante GPS y configurando los tipos de sitios que quieres encontrar te los ofrece mediante unos dibujos en pantalla según un radio de lo cercano o lejos que esté de tu posición.
		Es una gran aplicación en el campo del tratamiento de imagen pero nos diferencia de lo que ya he expuesto anteriormente. 
		\begin{center}
		\includegraphics[width = 100px,height=100px]{images/layar2.jpg}
		\includegraphics[width = 100px,height=100px]{images/layar.jpg} 
		\includegraphics[width = 100px,height=100px]{images/layar3.jpg}\\
		\end{center}		
			\item{\bf TripAdvisor}
				Ésta nos ofrece planificar nuestro viaje. Buscando hoteles, restaurantes y cosas divertidas que hacer, estés donde estés. No es tan impresionante como la anterior. Las diferencias con touriXta son básicamente las mismas, el transporte no está especificado y tampoco encontramos que la guía tenga audio; Lo que imposibilita a invidentes el conocer ciertos aspectos de lugares que no tienen accesible a tiempo real a no ser que sea con un guía personal.
		\begin{center}
			\includegraphics[width = 100px,height=100px]{images/tripAdvisor2.jpg}
			\includegraphics[width = 100px,height=100px]{images/tripAdvisor.jpg} 
			\includegraphics[width = 100px,height=100px]{images/tripAdvisor3.jpg}\\
		\end{center}
			\item{\bf Guia de Sevilla de eTravel}
			Es una guía bastante completa de sevilla. Permite organizar una visita por días. Información de lugares relevantes, conocer la cultura,... 
			\begin{center}
				\includegraphics[width = 100px,height=100px]{images/guiaSevilla.jpg}
				\includegraphics[width = 100px,height=100px]{images/guiaSevilla2.jpg} 
				\includegraphics[width = 100px,height=100px]{images/guiaSevilla3.jpg}\\
			\end{center}
		\end{enumerate}
\chapter{Conceptos sobre Android}
		 \section{\bf ¿Qué es una plataforma Software?}
		 Una plataforma de software es un elemento crucial en el desarrollo del mismo. Mediante el marco de trabajo que proporcionan las plataformas se puede crear nuevo software y que éste se pueda ejecutar sobre ellas. Las plataformas de desarrollo típicas incluyen una arquitectura de computadores, un sistema operativo, lenguajes de programación y sus correspondientes librerías o interfaces gráficas. \\
						
			{\bf Plataforma Software}
				\begin{center}
					\includegraphics[width=0.8\textwidth]{images/plataforma_software.jpg}\\
				\end{center}
		Las plataformas son comúnmente mencionadas con las APIs(funciones y métodos que ofrece una biblioteca para ser usada por otro software como una capa de abstracción). Un conjunto completo de APIs constituye una plataforma software. Estas plataformas son normalmente dependientes de los sistemas operativos aunque existen otras en las que no es así.
		Java es un ejemplo de plataforma no dependiente del sistema operativo debido a que es tanto el lenguaje como la plataforma de desarrollo, la cuál incluye la Java Virtual Machine(JVM) cuya función es interpretar el bytecode resultante de la compilación del código fuente del programa en Java.
		\section{\bf ¿Qué es Android?}
		 Android es una plataforma de software y un sistema operativo para dispositivos móviles basada en la kernel de Linux, desarrollada por Google y más tarde por la Open Handset Alliance(Es un grupo de 80 compañias de tecnología y móviles que juntos intentan acelerar la innovación de los dispositivos con Android). 
		 Esta plataforma permite a los desarrolladores escribir código en Java que se ejecuten en móviles mediante las librerías Java desarrolladas por Google. También se pueden escribir aplicaciones en otros lenguajes, como por ejemplo C, para posteriormente ser compiladas en código nativo ARM y ejecutarlas; o Python, que mediante la librería llamada PyGame que podemos encontrar en esta dirección http://pygame.renpy.org/ aunque estos procesos de desarrollo no están soportados oficialmente por Google. 
		 La mayor parte de la plataforma de Android está disponible bajo licencia de software libre de Apache y otras licencias OpenSource. 
		 
		 	\subsection{\bf Breve Historia}
		 		En Julio de 2005, Google adquirió Android Inc, una pequeña startup de California. En esos momentos, la compañía se dedicaba a la creación de software para teléfonos móviles. Una vez en Google, el equipo desarrolló un S.O. basado en Linux para dispositivos móviles. Más adelante, Google adaptó su buscador y sus aplicaciones para su uso en dispositivos móviles.
		 		En Septiembre de 2007, Google tenía varias patentes de aplicaciones sobre el área de la telefonía móvil. El 5 de Noviembre del mismo año, se anunció la fundación de la Open Handset Alliance, que está formada por un consorcio de actualmente 80 compañias de hardware, software y telecomunicaciones, entre las cuales se incluyen Google, HTC, Intel y Motorola, dedicadas a investigar estándares abiertos para dispositivos móviles.
		 		El primer teléfono en el mercado que posee Android es el T-Mobile G1 (Dream), lanzado en Octubre de 2008 que viene con la versión de Android 1.0 preinstalada. Este móvil es el resultado conjunto de T-Mobile, HTC y Google.  Desde el 21 de Octubre de 2008 , Android está disponible como OpenSource. Gracias a esto cualquier programador con conocimientos Java puede añadir nuevas aplicaciones o reemplazar las existentes por otras dentro de su dispositivo móvil.
		 	\subsection{\bf Características de Android}
		 	
		 		\begin{itemize}
		 				\item Amplia variedad de diseños(VGA, librerías de gráficos 2D,3D,...)
		 				\item Almacenamiento de datos en BBDD SQLite
		 				\item Conectividad
		 				\item Mensajería. SMS y MMS
			 			\item Navegador Web
			 			\item Máquina virtual de Java
			 			\item Las aplicaciones escritas en Java pueden ser compiladas y ejecutadas en la máquina virtual Dalvik, que está especializada para el uso en dispositivos móviles.
		 				\item Soporte de formatos: MPEG-4, H.264, MP3, AAC, OGG, AMR, JPEG, PNG, GIF.
		 				\item Soporte para hardware adicional (cámaras de video, pantallas táctiles, GPS, acelerómetros,...)
		 				\item Entorno de desarrollo(emulador, herramientas de depuración, perfiles de memoria y funcionamiento, plugin para Eclipse IDE)
		 		\end{itemize} 
		 	\newpage
		 	\subsection{\bf Arquitectura de Android}
		 	La Arquitectura Android es la que se muestra en la siguiente imagen: \\
		 	\begin{center}
				\includegraphics[width=0.6\textwidth]{images/arquitectura_Android.png}\\
			\end{center}
			A continuación se detallarán los diferentes componentes principales de la arquitectura Android: \\
			\begin{itemize}
				\item {\bf Aplicaciones.} Las aplicaciones base incluirán un cliente de email, programa de SMS, calendario, mapas, navegador, contactos y otros. Todas las aplicaciones están escritas en lenguaje de programación Java.
				\item {\bf Framework de Aplicaciones.} Los desarrolladores tienen acceso completo a las APIs del framework usado por aplicaciones base. La arquitectura está diseñada para simplificar el uso repetido de componentes; cualquier aplicación puede publicar sus capacidades y cualquier otra aplicación puede hacer luego uso de esas capacidades(sujeto a reglas de seguridad del framework). Este mismo mecanismo permite que los componentes sean reemplazados por el usuario. Este framework está formado por:
				\begin{quote}
					\item Un extenso conjunto de Vistas tales como listas, cajas de texto, botones, ...
					\item Content Providers que permiten a las aplicaciones acceder a información de otras aplicaciones o compartir su propia información.
					\item Resource Manager que proporciona acceso a recursos que no son código como pueden ser gráficos, cadenas de texto,...
					\item Notification Manager que permite a las aplicaciones mostrar alarmas personalizadas en la barra de estado o Activity Manager que gestiona el ciclo de vida de las aplicaciones.
					
				\end{quote}
				\item {\bf Librerías.} Android incluye un set de librerías C/C++ usadas por varios componentes del sistema . Estas capacidades se exponen a los desarrolladores a través del framework de aplicaciones Android, el cuál interactúa con las librerias mediante JNI(Java Native Interface). Algunas son System C Library(implementación librería C estándar), librerías de gráficos, 3D, SQLite, entre otras.
				\item {\bf Runtime de Android.} Android incluye  un set de librerías que proveen la mayor parte de las funcionalidades disponibles en las librerías base del lenguaje de programación Java. Cada aplicación Android corre su propio proceso, con su propia instancia de la máquina virtual Dalvik. Dalvik ha sido escrito de forma que un dispositivo puede correr múltiples máquinas virtuales eficientemente. Dalvik ejecuta archivos en el formato Dalvik Executable (.dex), el cuál está optimizado para memoria mínima.
				\item {\bf Núcleo -Linux.} Android depende de Linux versión 2.6 para los servicios base del sistema como seguridad, gestión de memoria, gestión de procesos, pila de red y modelo de drivers. El núcleo también actúa como una capa de abstracción entre el hardware y el resto de la pila. \\
				
			\end{itemize}
		\section{\bf Android SDK}
		El kit de desarrollo de software(software develpment kit o SDK) incluye un conjunto de herramientas de desarrollo, tales como un debbuger, librerías, un emulador(basado en QEMU, emulador de procesadores, virtualización dentro de Sistemas Operativos), documentación, código de ejemplo y tutoriales. Está soportado en S.O. Windows, Linux y Mac. El entorno de desarrollo(integrated development environment o IDE) oficialmente soportado es Eclipse conjuntamente con el plugin ADT proporcionado por Google. 
		Desde Noviembre de 2007 a Diciembre de 2010 han ido surgiendo nuevas actualizaciones del SDK, la última liberada fué Gingerbread, aunque la última en la que se está trabajando llamada IceCream Sandwich nos valdrán las actualizaciones tanto para tablets como para dispositivos móviles. \\
		\section{\bf Anatomía de una aplicación Android}
		Dentro de una aplicación de Android hay cuatro componentes principales: Activity, Listeners, Servicios y Content Provider. Todas las aplicaciones de Android están formadas por algunos de estos elementos o combinaciones de ellos. 
			\begin{itemize}
				\item {\bf Activity}
				Las Activities son los elementos constituyentes de Android más común. Para implementarlas se usa una clase por cada Actividad que extiende de la clase base Activity. Cada clase mostrará una interfaz de usuario, compuesta por Views(Vistas). Cada vez que se cambie de vista, se cambiará de actividad, ejemplo una aplciación de mensajería que se tiene una vista que muestra la lista de contactos y otra vista que se tiene para escribir los mensajes. Cuando cambiamos de Vista, la anterior queda pausada y puesta dentro de una pila del historial en caso necesario. También se pueden eliminar las Vistas del historial en caso de que no se necesiten más. Para pasar de vista en vista, Android usa una clase especial llamada Intent. 
				\begin{itemize}
					\item {\bf Intents}
					Un Intent es un objeto mensaje y que, en general, describe que quiere hacer una aplicación. Las dos partes más importantes de un Intent son la acción que se quiere realizar y la información necesaria que se proporciona para poder realizarla, la cual se expresa en formato URI. Un ejemplo sería ver la información de contacto de una persona, la cuál mediante un Intent con la acción ver y la URI que representa a esa persona se podría obtener.\\
					Básicamente un Intent nos permite pasar variables de una Actividad a otra. Un Intent se crea con una actividad origen y una destino. La Actividad origen guarda variables en ese Intent y la actividad destino las recoge. \\
					Relacionado con los Intents hay una clase llamada IntentFilter que es una descripción de qué Intents puede una Actividad gestionar. Mediante los IntentFilters, el sistema puede resolver Intents, buscando cuáles posee cada actividad y escogiendo aquél que mejor se ajuste a sus necesidades.\\ El proceso de resolver los Intents se realiza en tiempo real, lo cuál ofrece dos beneficios:\\
					\begin{itemize}
						\item Las actividades pueden reutilizar funcionalidades de otros componentes simplemente haciendo peticiones mediante un Intent.
						\item Las actividades pueden ser reemplazadas por nuevas actividades con IntentFilters equivalentes.
						\end{itemize}
\end{itemize}
										
					\item {\bf Listeners}
					Los Listeners se usan para relacionar a los eventos externos (por ejemplo al recibir un mensaje). Los listeners no tienen UI pero pueden usar el servicio Notification Manager para avisar al usuario. 
					Para lanzar un aviso no hace falta que la aplicación se esté ejecutando, en caso necesario, Android la iniciará si se activa el Listeners por algún evento. 
					\item{\bf Servicios}
					Un servicio es básicamente un código que se ejecuta durante un largo tiempo y sin necesidad de UI, como puede ser un gestor de descarga en el cuál se indican los contenidos a descargar y posteriormente el usuario puede acceder a una nueva Vista sin que el gestor se interrumpa. 
					En caso de que haya múltiples servicios a la vez, se les puede indicar diferentes  	prioridades según las necesidades.
					\item{\bf Content Provider}
					En Android, las aplicaciones pueden guardar su información en ficheros, BBDD SQLite,... Pero en caso de que lo que se quiera es compartir dicha información con otras aplicaciones, lo necesario es un Content Provider.Un Content Provider es una clase que implementa un conjunto estándar de métodos que permite a otras aplicaciones guardar y obtener la información que maneja dicho Content Provider.
					\item{\bf Android Manifest}
					El fichero XML AndroidManifest es necesario para el correcto funcionamiento de una aplicación. No pertenece al código principal de la aplicación. Es el fichero de control que le dice al sistema qué tiene que hacer con todos los componentes anteriormente mencionados que pertenecen a una aplicación.\\ 
					En este fichero se recoge la versión mínima de Android en la que funciona nuestra aplicación, el icono de la aplicación, su nombre y si necesita usar GPS, el acceso a Internet,...
			
					\end{itemize}
				\item{\bf Tipos de Aplicación de Android}
				Un Android Package (.apk) es el fichero que contiene el código de la aplicación y sus recursos, que posteriormente se instala en el dispositivo para poder ejecutar la aplicación. 
					\begin{itemize}
						\item {\bf Tareas}
						Una tarea en Android es lo que el usuario ve como una aplicación y el desarrollador ve como una o más actividades donde el usuario interacciona y va pasando de Vista en Vista. \\
						Dentro de las tareas, una actividad toma el papel de punto de entrada(será la primera en mostrarse cuando se ejecute la aplicación) y las demás, si hay, formarán parte de la misma tarea, a la espera de ser instanciadas.
						\item {\bf Procesos}
						En Android los procesos se ejecutan a nivel de kernel y el usuario normalmente no tiene constancia de ellos. Todo el código de la aplicación se suele ejecutar en un proceso dedicado pero también se puede especificar si sólo se quiere que se ejecute en el proceso de una determinada clase o componente de la aplicación.\\ Los principales usos de los procesos son:
						\begin{itemize}
							\item Mejorar la estabilidad o seguridad de las aplicaciones.
							\item Reducir la sobrecarga de proceso ejecutando el código de múltiples aplicaciones en el mismo proceso.
							\item Ayudar al sistema a gestionar los recursos separando partes de código pesado en un proceso separado que puede ser eliminado independientemente de otras partes de la aplicación.
						\end{itemize}
						
						\item {\bf Threads o Hilos}
						En lo referente a threads, Android evita la creación de threads adicionales por parte de un proceso, manteniendo la aplicación en un sólo thread al menos que no los cree la propia aplicación. Esto repercute de manera importante en las llamadas a instancias de Actividades, Listeners y Servicios, ya que sólo pueden ser hechas por el thread principal del proceso en el que están corriendo.\\
						Por otro lado, al no crearse un thread por cada instancia, dichas instancias no deben realizar operaciones largas o bloqueantes cuando son llamadas, de lo contrario, bloquearían todos los demás componentes del proceso.\\						
					\end{itemize}
				
		\section{\bf Ciclo de vida de una aplicación Android}
		Cada aplicación de Android corre en su propio proceso, el cuál es creado por la aplicación cuando se ejecuta y permanece hasta que la aplicación deja de trabajar o el sistema necesita memoria para otras aplicaciones. \\
		Una característica fundamental de Android es que el ciclo de vida de una aplicación no está controlado por la misma aplicación sino que lo determina el sistema a partir de una combinación de estados como pueden ser que aplicaciones están funcionando, qué prioridad tienen para el usuario y cuánta memoria queda disponible en el sistema. De esta manera, Android sitúa cada proceso en una jerarquía de "importancia" basada en los estados comentados, como puede verse a continuación:
		\begin{itemize}
			\item Un proceso en primer plano es uno que se requiere para lo que el usuario está actualmente haciendo. Se considera en primer plano si:\\
			\begin{itemize}
				\item Está ejecutándose una Actividad perteneciente a la pantalla con la que el usuario está interactuando.
				\item Está ejecutando un Broadcast Receiver.
				\item Está ejecutándose un servicio.
			\end{itemize}
			\end{itemize}
			\item Un proceso visible es aquél que contiene una Actividad que es visible al usuario mediante la pantalla pero no en primer plano(está pausada). Este proceso  sólo se eliminará en caso de que sea necesario para mantener ejecutándose los procesos en primer plano.
			\item Un proceso de servicio es aquél que contiene un servicio que ha sido inicializado. No son directamente visibles al usuario y el sistema los mantendrá a no ser que no pueda servir los dos anteriores.
			\item Un proceso en background es aquél que coge una actividad que no está actualmente visible al usuario. Mientras que dichos procesos implementan bien su propio ciclo de vida, el sistema puede eliminarlos para dar memoria a cualquiera de los tres servicios anteriores.
			\item Un proceso vacío es aquél que no contiene ningún componente activo de ninguna aplicación. La única razón para mantener dicho proceso es para mejorar sus inicializaciones posteriores a modo de memoria caché.								
		\end{itemize}
Para comprender mejor el ciclo de vida de una aplicación se muestra en la siguiente figura el diagrama de flujo de dicho ciclo. Además de mencionar los métodos que se llaman durante el transcurso del mismo.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{images/diagrama_flujo.png}\\
			\end{center}
			\newpage
		\section{\bf Almacenamiento}
		Android presenta varias maneras de almacenar la información. Es importante notar que en  Android todos los datos de la aplicación son privados a éstas. \\
		A continuación se muestra una tabla con los diferentes métodos de almacenamiento: \\
		 		\begin{center}
					\begin{tabular}{|p{5cm}|p{5cm}|}
						\hline
						{\bf Mecanismo} & {\bf Descripción} \\ \hline
						Preferencias    & Mecanismo ligero para almacenar y recuperar parejas clave-valor, útil para guardar preferencias \\ \hline
						Ficheros        & Se puede guardar tanto en el dispositivo como en dispositivos extraíbles\\ \hline
						BBDD            & Soporte para crear Bases de Datos SQLite privadas pertenecientes al package que las creó\\ \hline
						Content Provider & Explicamos más adelante\\ \hline
						Red              & Uso de la red para almacenar y recuperar información\\ \hline
					\end{tabular}				
				\end{center}
				Dentro de la categoría de ficheros, encontramos las imágenes de disco, que Android usa para poder almacenar los datos y las diferentes configuraciones, las cuáles simulan particiones flash de disco, por ejemplo, una imagen que contenga el kernel del emulador, una imagen para la memoria ram, datos de usuario y una imagen para simular la tarjeta SD.\\
				Por defecto Android guarda las localizaciones predeterminadas para éstas imágenes. Durante el arranque, el emulador busca y lee estos ficheros de imágenes. Esta ubicación se puede especificar mediante las opciones de arranque del emulador; si no se encuentra ninguna imagen usa las direcciones por defecto.\\
				El emulador usa tres tipos de imagen, de sistema, de runtime  y temporales. A continuación se explican estos tipos de imagen: \\
				\begin{itemize}
					\item Las imágenes de sistema contienen datos del sistema y configuraciones por defecto necesarias para que el emulador arranque. Estas imágenes son sólo de lectura, ya que no se deben modificar.
					\item Las imágenes de runtime leen y escriben datos. Son dos las de datos y las de tarjetas SD emuladas. Cada emulador usa una imagen de datos de usuario para guardar los datos específicos de sesión y usuario, como por ejemplo, las aplicaciones instaladas. Si se usan varias instancias de emulador a la vez, sólo la primera puede usar datos persistentes si no se especifican ficheros de imágenes diferentes en el arranque. Opcionalmente, se pueden crear imágenes de disco que emulen tarjetas SD. Solamente se puede cargar una imagen de disco en la carga del emulador. Además una vez cargada una tarjeta SD, no se pueden extraer de un emulador en funcionamiento, pero si navegar por ella y añadir o eliminar archivos. El emulador soporta tarjetas SDHC emuladas por lo que soporta tamaños de hasta 128 Gbytes.
					\item Las imágenes temporales, las cuáles se eliminan al apagar el dispositivo. Éstas son una copia de la imagen de sistema de Android y la imagen de la memoria caché.\\
				\end{itemize}
				\newpage
		\section{\bf Gráficos}
		Para implementar gráficos 2D y 3D Android usa OpenGL ES(OpenGL for Embedded Systems), una variante simplificada de la API gráfica OpenGL diseñada para dispositivos integrados tales como teléfonos móviles, PDAs y consolas de videojuego. La define y promueve el grupo Khronos, que es un consorcio de empresas dedicadas a hardware y software gráfico interesadas en APIs gráficas y multimedia. Existen varias versiones, de entre las cuales la versión 1.0 ha sido seleccionada como la API oficial para gráficos 3D de Android.\\
		Un ejemplo de esta potencia en 3D de Android nos lo da este fondo de pantalla llamado Aquarium descargable desde Market. \\
				\begin{center}
				\includegraphics[width=0.3\textwidth]{images/wallpaper_3D.jpg}\\
			\end{center}
		
		La API original, OpenGL, es una especificación estándar que define una API multilenguaje y multiplataforma para escribir aplicaciones que produzcan gráficos 2D y 3D. La interfaz consiste en más de 250 funciones diferentes y pueden usarse para dibujar escenas tridimensionales complejas a partir de primitivas geométricas simples, tales como puntos, líneas y triángulos. Fue desarrollada originalmente por Silicon Graphics Inc.(SGI) en 1992 y se usa ampliamente en CAD, realidad virtual, representación científica, visulaización de información y simulación de video. También se usa en desarrollo de videojuegos, donde compite con Direct3D en plataformas Microsoft Windows. OpenGL tiene dos propósitos esenciales :
		\begin{itemize}
			\item Ocultar la complejidad de la interfaz con las diferentes tarjetas gráficas, presentando al programador una API única y uniforme.
			\item Ocultar las diferentes capacidades de las diversas plataformas hardware requiriendo que todas las implementaciones soporten la funcionalidad completa de OpenGL (usando emulación software si fuese necesario)
		\end{itemize}
			Dado que la explicación del uso de OpenGL no tiene cabida dentro de este proyecto, no se darán más detalles al respecto.
		\section{\bf Direccionamiento en Android}
		Cada instancia en el emulador corre detrás de un router virtual que aísla el emulador de las interfaces de red del PC. Un dispositivo emulado no puede ver el PC u otro emulador de la red. En su lugar, sólo ve que está conectado a través de Ethernet a un router.\\
		Las últimas direcciones son usadas en todos los emuladores que se están ejecutando, reforzando el aislamiento. Este direccionamiento es específico al emulador y será diferente en dispositivos reales.\\
		 
		 \section{\bf Recursos}
		 Los recursos en Android son ficheros externos que no son código y que son usados y compilados dentro de la aplicación. Android soporta diferentes tipos de recursos, incluido XML, PNG y JPEG. Los ficheros XML tienen diferente formato dependiendo de lo que describan.\\
	Los recursos se exteriorizan respecto al código. Los ficheros XML se compilan dentro un archivo binario por razones de eficiencia y los strings se comprimen en una forma más eficiente de almacenamiento. Es por esta razón que hay diferentes tipos de recursos en Android. En general, hay recursos de tres tipos: ficheros XML, bitmaps y ficheros raw (por ejemplo, ficheros de sonido). \\
	A continuación en esta tabla se muestran los recursos posibles de Android:\\
	\begin{center}
					\begin{tabular}{|p{5cm}|p{5cm}|}
						\hline
						{\bf Tipo} & {\bf Descripción} \\ \hline
						Anim    & Ficheros XML que son compilados en objetos de animaciones \\ \hline
						Drawable        & Ficheros .png ó .jpg que se compilan como Bitmap\\ \hline
						Layout           & Ficheros XML compilados en vistas de pantalla\\ \hline
						Values & Ficheros XML que se compilan para definir varios tipos de recursos como Strings, Arrays,...\\ \hline
						Raw              & Ficheros arbitrarios que son copiados directamente al dispositivo. Por ejemplo una ruta en formato .kml\\ \hline
					\end{tabular}				
				\end{center}
		\section{\bf Herramientas de desarrollo}
		Para poder desarrollar sobre Android hay una serie de herramientas necesarias y unos requisitos que hay que tener en cuenta. A continuación se especifican todos ellos y se enumeran algunos extras necesarios para la ejecución de este proyecto.\\
		Herramientas del SDK:\\
		\begin{itemize}
			\item {\bf Emulator Console:} Algunas funciones en tiempo real del emulador, como el envío de SMS, pueden ser accedidas usando la consola del emulador mediante telnet a localhost y puerto, normalmente el 5554.
			\item {\bf Android Debug Bridge(ADB):} Proporciona acceso a funciones del emulador, incluido el redireccionamiento de puertos.
			\item {\bf Android Eclipse Views:} El plugin de Android para Eclipse añade un número de vistas para poder depurar la aplicación. Una de las más importantes es el Logcat, un visor de logs del dispositivo que puede ser filtrado en 5 categorías: V(Verbose, prioridad más baja), D(Debug), I(Info), W(Warning), E(Error), F(Fatal), S(Silent, prioridad más alta). El Logcat es muy útil porque nos da a conocer el valor de las variables en tiempo de ejecución.
			\item Herramienta de depuración Dalvik Debug Monitor Service. Tal herramienta ha sido esencial para pruebas en el emulador, ya que permite introducir localización GPS.
			\item {\bf Plataformas usadas para el proyecto:}
				\begin{itemize}
					\item Sony Vaio VPCEE2M1E/WI, Procesador AMD Athlon II Dual-Core P320/2.1GHz, 4GB de RAM, 500 GB de disco duro, Sistema Operativo Ubuntu Maverick Meerkat, versión 10.10 de Ubuntu. Emulador con Android 2.0.1 y API Google Maps 7.
					\item HTC Desire con Android 2.2
				\end{itemize}  
			\item {\bf Software usado:}
				\begin{itemize}				
					\item Ubuntu Maverick Meerkat, versión Ubuntu 10.10.
					\item Eclipse versión 3.5.2-6ubuntu1.1
					\item Android SDK 3.0 API 11, revision 1				
				\end{itemize}		
		\end{itemize}
		
		Requisitos mínimos según Google para que los dispositivos puedan contener Android son memorias RAM de 32MB, 32MB de memoria flash y un procesador de 200MHz. No obstante, estos requisitos deben ser mayores porque un dispositivo móvil basado en Linux requiere memoria de 128x128 y un procesador mayor de 200MHz, para soportar concurrencia. Además en algunas aplicaciones se requiere hardware adicional como puede ser una cámara o el GPS. 

\chapter{Uso de Android}
	\section{AndroidManifest.xml}
		Es el fichero de control y es uno de los ficheros más importantes de cualquier aplicación de Android. \\
		Es un fichero con extensión xml, se genera automáticamente al crear el proyecto. En él se declaran todas las especificaciones de nuestra aplicación. Las especificaciones son las Activities usadas en la aplicación, los Intents, las bibliotecas, el nombre de la aplicación, el hardware que necesitará, el icono de la aplicación(su apariencia en el dispositivo),...\\
		Citando a Brian Marick : "An example would be handy right about now", que se traduce como "Un ejemplo a mano sería la mejor manera de mostrarlo"\\
		Usando el AndroidManifest.xml de la aplicación:\\
				\begin{center}
			\includegraphics[width = 300px,height=300px]{images/manifest.png}
				\end{center}
			\\
	Como el resto de ficheros xml de la aplicación,incluye una declaración de espacio de nombres. Esta declaración permite usar una variedad de atributos estándares de Android. \\
	Incluye un elemento <application>, que define todas las activities que hay disponibles en el package definido. \\
	Cualquier package que sea presentado al usuario como aplicación de alto nivel necesitará incluir como mínimo un componente <activity> que soporte la acción del MAIN y la categoría LAUNCHER.\\
	En el atributo minSdkVersion se indica la mínima versión de Android con la que es compatible nuestra aplicación, en este caso es la 7, que como mínimo debe tener la versión 2.1 API 7 en adelante. \\
	Las aplicaciones de Android no tienen permisos asociados a no ser que se configuren previamente en este fichero. Así evitamos modificaciones no deseadas en la información del dispositivo. Por lo tanto, para poder usar las funcionalidades protegidas, se deben incluir los tags <uses-permission> en el AndroidManifest declarando los permisos necesarios.\\
	En una aplicación que necesite conexión a Internet se debe indicar:
		\begin{center}
			\includegraphics[width=0.7\textwidth]{images/permiso.png}
		\end{center}
			
	\\
	\section{Interfaz de Usuario}
	La implementación de la UI de una pantalla de una aplicación. Elementos que la conforman, como se definen los archivos xml,...\\
		\subsection{XML}
		A la hora de diseñar la UI, Android permite hacerlo tanto por código Java en tiempo de ejecución como por ficheros xml. El uso de xml es mejor puesto que ofrece claridad a la hora de encontrar errores.\\
		La ventaja de declarar nuestra UI en xml es que podemos separar mucho mejor la presentación de nuestra aplicación del código que controla su comportamiento. Los objetos pertenecientes a la UI son externos al código de la aplicación por lo tanto podemos modificarlos sin tener que modificar nuestro código fuente y recompilar. Podemos crear layouts XML para diferentes orientaciones de pantalla, tamaños y lenguajes. \\
		Android define un diverso número de elementos personalizados, cada uno representando una subclase del View. Para diseñar una interfaz, se anidan los diferentes elementos y se guardan en un fichero xml dentro del directorio res/layout de la aplicación. Cada fichero describe una sola pantalla pero esta puede estar compuesta tanto por un elemento simple como por un conjunto de ellos.\\
		Android dibuja los elementos en el orden que aparece en el xml, por lo que si algún elemento se solapa, se dibujará el último que se lea. Cada fichero xml se compila a partir del árbol de elementos por lo que el fichero sólo debe contener un tag root.\\
		Un ejemplo sería el siguiente:\\
		\begin{center}
			\includegraphics[width=0.7\textwidth]{images/layout_main1.png}
			\includegraphics[width=0.6\textwidth]{images/layout_main2.png}
		\end{center}
		


\end{document}
